๐Ÿš€ Java ์ค‘๊ธ‰ 2ํŽธ: ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ ๋งˆ์Šคํ„ฐ

NOTE

์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ โ€œ์“ธ ์ค„ ์•„๋Š” ๋‹จ๊ณ„โ€์—์„œ โ€œ์–ธ์ œยท์™œยท๋ฌด์—‡์„ ์„ ํƒํ•ด์•ผ ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ๊ณ„โ€๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ์ •๋ฆฌ โ€” ์ œ๋„ค๋ฆญ, List/Set/Map, Stack/Queue/Deque, ์ˆœํšŒ, ์ •๋ ฌ, Enum ์ปฌ๋ ‰์…˜, ๋ถˆ๋ณ€ ์ปฌ๋ ‰์…˜.

๐Ÿ“Œ ๊ฐœ๋…

1. ์ œ๋„ค๋ฆญ (Generic)

๐Ÿ”‘ ํ•ต์‹ฌ ๋ชฉ์ 

  • ์ปดํŒŒ์ผ ํƒ€์ž„ ํƒ€์ž… ์•ˆ์ •์„ฑ
  • ํ˜•๋ณ€ํ™˜ ์ œ๊ฑฐ
  • ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ ์ฆ๊ฐ€
List<String> list = new ArrayList<>();
// list.add(10); // ์ปดํŒŒ์ผ ์—๋Ÿฌ (์•ˆ์ „)

๐Ÿ”ธ ์™€์ผ๋“œ์นด๋“œ (?) โ€“ PECS ์›์น™

PECS: Producer Extends, Consumer Super

ํ‘œํ˜„์˜๋ฏธ์‚ฌ์šฉ ๋ชฉ์ 
<? extends T>T ๋˜๋Š” ์ž์‹์ฝ๊ธฐ ์ „์šฉ
<? super T>T ๋˜๋Š” ๋ถ€๋ชจ์“ฐ๊ธฐ ์ „์šฉ
void read(List<? extends Number> list) { } // get OK
void write(List<? super Integer> list) { } // add OK

โš ๏ธ ํƒ€์ž… ์ด๋ ˆ์ด์ € (Type Erasure)

  • ์ œ๋„ค๋ฆญ ์ •๋ณด๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์—๋งŒ ์กด์žฌ
  • ๋Ÿฐํƒ€์ž„์—๋Š” ๋ชจ๋‘ Object
  • ๊ทธ๋ž˜์„œ new T() ๋ถˆ๊ฐ€๋Šฅ, instanceof List<String> ๋ถˆ๊ฐ€๋Šฅ

2. List ๊ณ„์—ด

ArrayList vs LinkedList

ํ•ญ๋ชฉArrayListLinkedList
๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฐฐ์—ด์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ
์กฐํšŒ(get)โญ O(1)โŒ O(n)
์ค‘๊ฐ„ ์‚ฝ์ž…/์‚ญ์ œโŒ O(n)โญ O(1)
์‹ค๋ฌด ์‚ฌ์šฉโญโญโญโญโญ๊ฑฐ์˜ ์•ˆ ์”€

TIP

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ArrayList๊ฐ€ ์ •๋‹ต. LinkedList๋Š” ์ด๋ก ์šฉ์— ๊ฐ€๊น๋‹ค.

3. Set & Hash ๊ตฌ์กฐ

Set ๊ณตํ†ต ํŠน์ง•

  • ์ค‘๋ณต โŒ
  • ์ˆœ์„œ โŒ (๊ตฌํ˜„์ฒด์— ๋”ฐ๋ผ ์˜ˆ์™ธ ์žˆ์Œ)

hashCode + equals ํ•ต์‹ฌ ์›๋ฆฌ

1. hashCode() โ†’ ๊ฐ™์€ ๋ฒ„ํ‚ท
2. equals() โ†’ ์ง„์งœ ๊ฐ™์€ ๊ฐ์ฒด์ธ์ง€ ํ™•์ธ

๐Ÿ‘‰ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ž˜๋ชป ๊ตฌํ˜„ํ•˜๋ฉด Set / Map ๋™์ž‘์ด ๊นจ์ง

Set ๊ตฌํ˜„์ฒด ๋น„๊ต

๊ตฌํ˜„์ฒดํŠน์ง•
HashSet๊ฐ€์žฅ ๋น ๋ฆ„ (O(1))
LinkedHashSet์ž…๋ ฅ ์ˆœ์„œ ์œ ์ง€
TreeSet์ •๋ ฌ ์œ ์ง€ (O(log n))

4. Map (์ค‘์š” โญโญโญโญโญ)

Map = Set + Value

  • Key = Set ๊ตฌ์กฐ
  • Value๋Š” ๋ค

Map ๊ตฌํ˜„์ฒด ์„ ํƒ ๊ธฐ์ค€

์ƒํ™ฉ์ถ”์ฒœ
์„ฑ๋Šฅ ์ตœ์šฐ์„ HashMap
์ž…๋ ฅ ์ˆœ์„œ ํ•„์š”LinkedHashMap
์ •๋ ฌ ํ•„์š”TreeMap

โš ๏ธ Map Key ์ฃผ์˜์‚ฌํ•ญ

Key ๊ฐ์ฒด๋Š” ๋ฐ˜๋“œ์‹œ hashCode(), equals()๋ฅผ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์ผ๊ด€๋˜๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ

5. Stack & Queue & Deque

โŒ Stack ํด๋ž˜์Šค ์“ฐ์ง€ ๋งˆ์„ธ์š”

  • ๋‚ด๋ถ€๊ฐ€ Vector (๊ตฌ์‹œ๋Œ€ ์œ ๋ฌผ)
  • ๋™๊ธฐํ™” ๊ณผ๋„ โ†’ ์„ฑ๋Šฅ ๋‚˜์จ

โœ… ArrayDeque ํ•˜๋‚˜๋กœ ํ•ด๊ฒฐ

์šฉ๋„๋ฉ”์„œ๋“œ
Stackpush(), pop()
Queueoffer(), poll()
DequeofferFirst, offerLast
Deque<Integer> dq = new ArrayDeque<>();

TIP

Stack / Queue / Deque โ†’ ArrayDeque

6. ์ˆœํšŒ (Iterable & Iterator) โญ ์ถ”๊ฐ€ ์ค‘์š”

Iterator์˜ ์ง„์งœ ์˜๋ฏธ

์ž๋ฃŒ๊ตฌ์กฐ ๋‚ด๋ถ€๋ฅผ ๋ชฐ๋ผ๋„ ์ˆœํšŒ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค

Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
    System.out.println(it.next());
}

for-each์˜ ์ •์ฒด

for (int x : list) { }
// โ†“ ๋‚ด๋ถ€์ ์œผ๋กœ Iterator ์‚ฌ์šฉ

โš ๏ธ Fail-Fast Iterator

  • ์ˆœํšŒ ์ค‘ ์ปฌ๋ ‰์…˜ ๊ตฌ์กฐ ๋ณ€๊ฒฝ ์‹œ ConcurrentModificationException
  • Iterator.remove()๋งŒ ํ—ˆ์šฉ

7. ์ •๋ ฌ (Comparable & Comparator)

Comparable (์ž๊ธฐ ์ž์‹  ๊ธฐ์ค€)

class Student implements Comparable<Student> {
    public int compareTo(Student o) {
        return this.score - o.score;
    }
}

Comparator (์™ธ๋ถ€ ๊ธฐ์ค€)

Comparator<Student> comp =
    Comparator.comparing(Student::getScore)
              .thenComparing(Student::getName);

๐Ÿ›  ์‹ค๋ฌด ํ•ต์‹ฌ: ๋‹ค์ค‘ ์กฐ๊ฑด ์ •๋ ฌ (๋žŒ๋‹ค ๋ฒ„์ „)

students.sort(
    Comparator.comparing(Student::getScore).reversed()
              .thenComparing(Student::getName)
);

TIP

๋ฉด์ ‘ ํฌ์ธํŠธ: if ๋น„๊ต๋ณด๋‹ค Comparator ์ฒด์ด๋‹์ด ํ›จ์”ฌ ๊ฐ€๋…์„ฑ + ์•ˆ์ •์„ฑ ๋†’์Œ

8. Collections ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค โญ ์ถ”๊ฐ€

Collections.sort(list);
Collections.reverse(list);
Collections.shuffle(list);
Collections.max(list);
Collections.min(list);

โš ๏ธ Collections โ‰  Collection

  • Collection : ์ธํ„ฐํŽ˜์ด์Šค
  • Collections : ์œ ํ‹ธ ํด๋ž˜์Šค

9. Enum ์ „์šฉ ์ปฌ๋ ‰์…˜ โญ ์‹ค๋ฌด ๊ฟ€ํŒ

EnumSet

  • ๋‚ด๋ถ€๊ฐ€ ๋น„ํŠธ ์—ฐ์‚ฐ
  • HashSet๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฆ„
EnumSet<Day> days = EnumSet.of(MON, TUE);

EnumMap

  • Key๊ฐ€ Enum์ผ ๋•Œ ์ตœ์ 
EnumMap<Day, String> map = new EnumMap<>(Day.class);

10. ๋ถˆ๋ณ€ ์ปฌ๋ ‰์…˜ (Java 9+) โญ ์ถ”๊ฐ€

List.of(1,2,3);
Set.of("A","B");
Map.of("a",1,"b",2);
  • ์ˆ˜์ • ์‹œ UnsupportedOperationException
  • ๋ฐฉ์–ด์  ๋ณต์‚ฌ ๋Œ€์ฒด ๊ฐ€๋Šฅ

๐ŸŽฏ ๋งˆ๋ฌด๋ฆฌ ์š”์•ฝ (์ง„์งœ ์ค‘์š”)

์ปฌ๋ ‰์…˜์„ ์ž˜ ์•ˆ๋‹ค๋Š” ๊ฒƒ์€ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์™ธ์šด๋‹ค๋Š” ๋œป์ด ์•„๋‹ˆ๋ผ

  • โœ” ๋ฐ์ดํ„ฐ ํŠน์„ฑ์— ๋งž๋Š” ์„ ํƒ
  • โœ” ์„ฑ๋Šฅ/์ˆœ์„œ/์ค‘๋ณต ํŒ๋‹จ
  • โœ” ๋‚ด๋ถ€ ์›๋ฆฌ(hash, iterator, ์ •๋ ฌ)๋ฅผ ์„ค๋ช… ๊ฐ€๋Šฅ

์ด๋ผ๋Š” ๋œป์ด๋‹ค.

๊ด€๋ จ ๋ฌธ์„œ